package com.gofun.framework.core.utils;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;


@Component
public class ApplicationContextUtils implements ApplicationContextAware {
	
	private static ApplicationContext context;

	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		context = applicationContext;
	}
	
	/**
	 *  @Description	: 根据bean名称获取bean
	 *  @return         : T
	 *  @Creation Date  : 2016年5月17日 下午4:10:40 
	 *  @Author         : wangchao
	 */
	@SuppressWarnings("unchecked")
	public static <T> T getBean(String name) throws BeansException {
		return (T) context.getBean(name);
	}
	
	/**
	 *  @Description	: 获取类型为requiredType的对象
	 *  @return         : T
	 *  @Creation Date  : 2016年5月17日 下午4:10:08 
	 *  @Author         : wangchao
	 */
	public static <T> T getBean(Class<T> clz) throws BeansException {
		return (T) context.getBean(clz);
	}
	
	/**
	 *  @Description	: 如果ApplicationContext包含一个与所给名称匹配的bean定义，则返回true
	 *  @return         : boolean
	 *  @Creation Date  : 2016年5月17日 下午4:11:15 
	 *  @Author         : wangchao
	 */
	public static boolean containsBean(String name) {
		return context.containsBean(name);
	}
	
	/**
	 *  @Description	: 判断以给定名字注册的bean定义是一个singleton还是一个prototype
	 *  @return         : boolean
	 *  @Creation Date  : 2016年5月17日 下午4:11:46 
	 *  @Author         : wangchao
	 */
	public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
		return context.isSingleton(name);
	}
	
	/**
	 *  @Description	: 注册对象的类型
	 *  @return         : Class<?>
	 *  @Creation Date  : 2016年5月17日 下午4:12:13 
	 *  @Author         : wangchao
	 */
	public static Class<?> getType(String name) throws NoSuchBeanDefinitionException {
		return context.getType(name);
	}
	
	/**
	 *  @Description	: 如果给定的bean名字在bean定义中有别名，则返回这些别名
	 *  @return         : String[]
	 *  @Creation Date  : 2016年5月17日 下午4:12:31 
	 *  @Author         : wangchao
	 */
	public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {
		return context.getAliases(name);
	}

}
